from toolsSrc.status.status import Status
from toolsSrc.status.status import Status
import shutil
import os
import time
import numpy as np
import pandas as pd
from common.config import torqueConfig as Config

'''#########################################################################################
判断 his 文件夹中的数据文件个数是否够用，如果不够，生成需要主动探索数据表 df_torqueExplore
'''
@Status.changeStatus(4,1)
def prepareTorqueExploreData():
    df_torqueExplore = pd.DataFrame(columns=[Config.torquePlcKey], index=None)
    if not os.path.exists(Config.historyDataRoot): os.mkdir(Config.historyDataRoot)
    hisFiles = os.listdir(Config.historyDataRoot)

    # 如果 his 数据不够，生成 Explore 数据
    if len(hisFiles) < Config.hisFiles_min:
        adjRatio_list = [1 + ratio for ratio in
                         np.linspace(-Config.torqCoef_AdjLimit, Config.torqCoef_AdjLimit, Config.hisFiles_min)]
        df_torqueExplore = pd.DataFrame({Config.torquePlcKey: adjRatio_list})  # 'KoptOffset' 与PLC字段一致
        print("df_TorqueExplore: ", df_torqueExplore)

    return df_torqueExplore


'''##########################################################################################
将 df_torqueExplore中第 i 条数据写入torqueUpload.csv(opcUa上传频率比价高，会马上上传）
'''
def torqueExploreUpOne(df_torqueExplore, i):

    torque = df_torqueExplore.iloc[i, 0]  # df_torqueExplore中第一行数据（主动探索的一个转矩系数）
    df_torqueUploadData = pd.DataFrame({Config.torquePlcKey: [torque]})
    df_torqueUploadData.to_csv(Config.torqueUpload)

'''
根据时间戳，在数据池 pool 中取一个新生成的数据文件，拷贝到 historyDataRoot 文件夹中
这个函数和 pitchExploreDownOne() 是一样的，要不要公用一个？？？？？？？？
'''
def torqueExploreDownOne():
    startTime = time.time()
    if not os.path.exists(Config.historyDataRoot): os.mkdir(Config.historyDataRoot)
    while True:
        files = os.listdir(Config.poolRoot)
        times = list(map(lambda fn: os.path.getmtime(Config.poolRoot + '/' + fn), files))
        maxIndex = np.argmax(times)
        if times[maxIndex] > startTime:
            # os.system( Config.copyCommand + ' '+ Config.poolRoot + '/' + files[maxIndex] + ' ' + Config.historyDataRoot)
            shutil.copy(Config.poolRoot+ files[maxIndex], Config.historyDataRoot)
            break
        time.sleep(1)  # 等待时间不能小于 pool 采集一个文件的时间， 用在config中设置么？？？？？？？？？？？？？？？？？？？？

'''
1. 分批次上传 df_torqueExplore 中的 torque 数据
2. 每上传一个 torque，采集一个数据文件，保存到history中
'''
def torqueExploreUpDown(df_torqueExplore):
    length = len(df_torqueExplore)
    for i in range(length):
        torqueExploreUpOne(df_torqueExplore,i)  # 将第i几条记录上传
        torqueExploreDownOne()  # 下载一个数据文件



'''########################################################################################
1. 准备主动探索数据 df_torqueExplore
2. 主动探索（多次，直到数据全部采集全）
'''
@Status.changeDBStatus('torque',4,1)
@Status.changeStatus(4,1)
def torqueExplore():
    df_torqueExplore = prepareTorqueExploreData()
    while len(df_torqueExplore) > 0:
        torqueExploreUpDown(df_torqueExplore)
        df_torqueExplore = prepareTorqueExploreData()